﻿namespace DDotNet.ORM.ORMapping.Validation
{
    /// <summary>
    /// Contém as Expressores Regulares mais Comuns
    /// </summary>
    public abstract class CommonRegexExpressions
    {
        /// <summary>
        /// Contém a Expressão Regular para a Validação de CPF
        /// </summary>
        /// <remarks>Validação para os Formatos: XXX.XXX.XXX-XX ou XXXXXXXXXXX</remarks>
        public const string CPF = @"\d{3}.?\d{3}.?\d{3}-?\d{2}";

        /// <summary>
        /// Contém a Expressão Regular para a Validação de CNPJ
        /// </summary>
        /// <remarks>Validação para os Formatos: XX.XXX.XXX/XXXX-XX ou XXXXXXXXXXXXXX</remarks>
        public const string CNPJ = @"\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2}";

        /// <summary>
        /// Contém a Expressão Regular para a Validação de CEP
        /// </summary>
        /// <remarks>Validação para o Formato XXXXX-XXX</remarks>
        public const string CEP = @"\d{5}-\d{3}";

        /// <summary>
        /// Contém a Expressão Regular para a Validação de Email
        /// </summary>
        public const string Email = @"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@(([0-9a-zA-Z])+([-\w]*[0-9a-zA-Z])*\.)+[a-zA-Z]{2,9})$";

        /// <summary>
        /// Contém a Expressão Regular para a Validação de Endereço de URL
        /// </summary>
        public const string Url = @"^(https?://)"
        + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //user@ 
        + @"(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP- 199.194.52.184 
        + "|" // allows either IP or domain 
        + @"([0-9a-z_!~*'()-]+\.)*" // tertiary domain(s)- www. 
        + @"([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // second level domain 
        + "[a-z]{2,6})" // first level domain- .com or .museum 
        + "(:[0-9]{1,4})?" // port number- :80 
        + "((/?)|" // a slash isn't required if there is no file name 
        + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";

        /// <summary>
        /// Contém a Expressão Regular para a Validação do Número de Cartão de Crédito MasterCard
        /// </summary>
        public const string NumeroCartaoCredito_MasterCard = @"^5[1-5]\d{14}$";

        /// <summary>
        /// Contém a Expressão Regular para a Validação do Número de Cartão de Crédito Visa
        /// </summary>
        public const string NumeroCartaoCredito_Visa = @"^4(\d{12}|\d{15})$";

        /// <summary>
        /// Contém a Expressão Regular para a Validação do Número de Cartão de Crédito Amex
        /// </summary>
        public const string NumeroCartaoCredito_Amex = @"^3(3|7)\d{14}$";

        /// <summary>
        /// Contém a Expressão Regular para a Validação do Número de Cartão de Crédito Diners Club
        /// </summary>
        public const string NumeroCartaoCredito_DinersClub = @"^3((6|8)\d{12})|(00|01|02|03|04|05)\d{11})$";
    }
}